/**
 * @brief     数据库连接
 * @details   可连接 MySQL SQLITE ORACLE的数据库
 * @author    Yin
 * @version   1.0
 * @date
 * @copyright
 * @note
 */

#ifndef DATABASELINK_H
#define DATABASELINK_H

#include "common_global.h"

#include <QObject>
#include <QSqlDatabase>
#include <QSqlError>
#include <QUuid>

#include "databasedatastruct.h"

namespace Common {

class COMMONSHARED_EXPORT DatabaseLink : public QObject
{
    Q_OBJECT
public:
    explicit DatabaseLink(DatabaseType type = DB_MYSQL, QString connectName = "", QObject *parent = nullptr);
    ~DatabaseLink();

public:
    /*!
     * @brief   init 加载对应类型数据库驱动
     * @return  数据库驱动是否加载成功
     * @note    目前支持的数据库可参考 @link DatabaseType @endlink
     */
    bool init();

    /**
     * @brief openDB 打开数据库
     * @param hostName 主机名
     * @param dbName 待访问数据库名
     * @param dbUser 用户名
     * @param password 密码
     * @param port 数据库端口
     * @return
     */
    bool open(const QString& hostName, const QString& dbName, const QString& dbUser, const QString& password, int port);

    /**
     * @brief closeDB 关闭数据库
     */
    void closeDB();

    /**
     * @brief sqlType 获取数据库类型
     * @return
     */
    DatabaseType sqlType(){ return m_dbType; }

    /**
     * @brief connectionName 数据库连接名
     * @return
     */
    QString connectionName() {return m_database.connectionName();}

    /**
     * @brief sqlDatabase 数据库操作
     * @return
     */
    QSqlDatabase& sqlDatabase() { return m_database; }

    /**
     * @brief 获取数据库是否存在错误
     * @return
     */
    bool isError()const { return m_bDbError;}

    /**
     * @brief 获取数据库错误信息
     * @return
     */
    QString errorInfo()const;

private:
    /**
     * @brief createDatabaseId 创建数据库的Id
     * @return
     * @note 采用UUID来区分不同的数据库连接
     */
    QString createDatabaseId();

private:
    DatabaseType m_dbType;                          // 数据库类型
    QString m_databaseId;                           // 数据库连接标识
    QSqlDatabase m_database;                        // 数据连接函数
    bool m_bDbError;                                // 是否存在错误
    bool m_bDbOpen;                                 // 数据库是否开启
};

}// namespace Common {

#endif // DATABASELINK_H
